package top.yangbuyi.controller.doctor;

import cn.hutool.core.bean.BeanUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import jdk.nashorn.internal.ir.annotations.Reference;
import lombok.extern.log4j.Log4j;
import org.springframework.web.bind.annotation.*;
import top.yangbuyi.constants.Constants;
import top.yangbuyi.controller.BaseController;
import top.yangbuyi.domain.CareHistory;
import top.yangbuyi.domain.CareOrder;
import top.yangbuyi.domain.CareOrderItem;
import top.yangbuyi.service.CareService;
import top.yangbuyi.vo.AjaxResult;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.*;


/**
 * @description: 杨不易网站:www.yangbuyi.top
 * @program: yangbuyiopenHis2020
 * @ClassName: OrderController636336
 * @create: 2020-09-14 17:07
 * @author: yangbuyi
 * @since： JDK1.8
 * @OrderController: 处方收费管理$
 **/

@RestController
@Log4j
@RequestMapping("doctor/charge")
public class OrderChargeController extends BaseController {
	  /**
	   * @功能描述:远程调用
	   * @Description:处方、病例、开诊$
	   * @Author: TeouBle
	   * @Date: 2020/9/17 10:10
	   */
	  @Reference
	  private CareService careService;

	  /**
	   * @功能描述:根据挂号ID查询未支付的处方信息及详情
	   * @Description:根据病例ID查询处方信息------------------
	   * @Author: TeouBle
	   * @Date: 2020/9/14 17:18
	   */
	  @GetMapping(value = "getNoChargeCareHistoryByRegId/{regId}")
	  @HystrixCommand
	  public AjaxResult getNoChargeCareHistoryByRegId(@PathVariable String regId) {
			try {
				  // 声明返回的json类型
				  /*
				   * data:{
				   * 	careHistory:{....}  	object
				   * 	careOrders:[{  object []
				   *     ......
				   * 	  "careOrderItems":[{
				   * 	  	......
				   * 	  }]
				   *   }]
				   *
				   * }
				   * */
				  Map<String, Object> res = new HashMap<>();
				  // 根据挂号ID查询病例信息
				  CareHistory careHistory = this.careService.queryCareHistoryByRegId(regId);
				  if (null == careHistory) {
						return AjaxResult.fail("【" + regId + "】 该挂号单没有对应的病例信息,请核对后再次查询");
				  }

				  // 组装数据 存放默认参数
				  // 病例信息
				  res.put("careHistory", careHistory);
				  // 处方信息
				  res.put("careOrders", Collections.EMPTY_LIST);
				  // 声明一个 可以 存放  careOrder的集合
				  List<Map<String, Object>> mapList = new ArrayList<>();
				  // 根据病例编号查询 处方信息 和 处方详细信息
				  List<CareOrder> careOrders = this.careService.queryCareOrdersByChId(careHistory.getChId());
				  if (careOrders.isEmpty()) {
						return AjaxResult.fail("【" + regId + "】 该挂号单没有相关的处方信息,请核对后再次查询");
				  }

				  // 组装 处方详细信息
				  for (CareOrder careOrder : careOrders) {
						// 将对象转换为 map
						Map<String, Object> beanToMap = BeanUtil.beanToMap(careOrder);
						// 定义一个 默认的处方详细
						beanToMap.put("careOrderItems", Collections.EMPTY_LIST);
						BigDecimal bigDecimal = new BigDecimal("0");
						// 根据处方信息 查询 未支付的 处方详细信息
						List<CareOrderItem> careOrderItems = this.careService.queryCareOrdersItemsByCoId(careOrder.getCoId(), Constants.ORDER_DETAILS_STATUS_0);

						// 如果当前的未支付处方详细为空 就 跳过当前循环
						if (careOrderItems.isEmpty()) {
							  continue; // 不进行注入到前端页面当中
						} else {
							  // 重新计算处方的总价
							  for (CareOrderItem careOrderItem : careOrderItems) {
									bigDecimal = bigDecimal.add(careOrderItem.getAmount());
							  }
							  // 组装完整数据
							  beanToMap.put("careOrderItems", careOrderItems);
							  mapList.add(beanToMap);
						}

				  }
				  // 如果 没有 未支付的 处方信息
				  if (mapList.isEmpty()) {
						return AjaxResult.fail("【" + regId + "】 该挂号单没有未支付的处方信息,请核对后再次查询");
				  } else {
						// 放入处方
						res.put("careOrders", mapList);
						return AjaxResult.success("查询成功", res);
				  }
			} catch (Exception e) {
				  e.printStackTrace();
			}
			return AjaxResult.error("收费出错");
	  }

}
